#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
int T,n,m,L,V,p[MAXN],laz[100010],laz1[100010];
int ans1,ans2;
struct Node{
    int d,v,a,l,r;
}car[MAXN];
void js(int t)
{
    bool flag=1;
    if(car[t].a==0)
    {
        if(car[t].v>V)
            for(int i=car[t].d;i<=L;i++)
            {
                laz[i]++;
                if(laz1[i]&&flag)
                {
                    car[t].l=i;
                    ans1++;
                    flag=0;
                }
                else if(laz1[i]&&!flag)
                {
                    car[t].r=i;
                }
            }
    }
    else if(car[t].a>0)
    {
        if(car[t].v>V)
            for(int i=car[t].d;i<=L;i++)
            {
                laz[i]++;
                if(laz1[i]&&flag)
                {
                    car[t].l=i;
                    ans1++;
                    flag=0;
                }
                else if(laz1[i]&&!flag)
                {
                    car[t].r=i;
                }
            }
        else if(car[t].v==V)
        {
            for(int i=car[t].d+1;i<=L;i++)
            {
                laz[i]++;
                if(laz1[i]&&flag)
                {
                    car[t].l=i;
                    ans1++;
                    flag=0;
                }
                else if(laz1[i]&&!flag)
                {
                    car[t].r=i;
                }
            }
        }
        else
        {
            double v1=car[t].v,v2=V;
            int dis;
            dis=int((v2*v2-v1*v1)/(2.0*car[t].a))+1;
            for(int i=car[t].d+dis;i<=L;i++)
            {
                laz[i]++;
                if(laz1[i]&&flag)
                {
                    car[t].l=i;
                    ans1++;
                    flag=0;
                }
                else if(laz1[i]&&!flag)
                {
                    car[t].r=i;
                }
            }
        }
    }
    else
    {
        if(car[t].v>V)
        {
            double v1=car[t].v,v2=V;
            int dis;
            dis=int((v1*v1-v2*v2)/(-2.0*car[t].a));
            if(dis==floor((v1*v1-v2*v2)/(-2.0*car[t].a)))
                dis--;
            for(int i=car[t].d;i<=min(car[t].d+dis,L);i++)
            {
                laz[i]++;
                if(laz1[i]&&flag)
                {
                    car[t].l=i;
                    ans1++;
                    flag=0;
                }
                else if(laz1[i]&&!flag)
                {
                    car[t].r=i;
                }
            }
        }
    }
    return;
}
bool cmp(Node a,Node b)
{
    return a.l<b.l;
}
int main()
{
    freopen("color.in","r",stdin);
    freopen("color.out","w",stdout);
    cin>>T;
    while(T--)
    {
        ans1=0;
        ans2=1;
        for(int i=1;i<=MAXN;i++)
        {
            car[i].d=0;
            car[i].a=0;
            car[i].v=0;
            car[i].l=0;
            car[i].r=0;
        }
        memset(p,0,sizeof(p));
        memset(laz,0,sizeof(laz));
        memset(laz1,0,sizeof(laz1));
        cin>>n>>m>>L>>V;
        for(int i=1;i<=n;i++)
            cin>>car[i].d>>car[i].v>>car[i].a;
        for(int i=1;i<=m;i++)
        {
            cin>>p[i];
            laz1[p[i]]++;
        }
        for(int i=1;i<=n;i++)
            js(i);
        for(int i=1;i<=n;i++)
        {
            if(car[i].l!=0&&car[i].r==0)
                car[i].r=car[i].l;
        }
        sort(car+1,car+1+n,cmp);
        int k=0;
        for(int i=1;i<=n;i++)
        {
            if(car[i].l>k)
            {
                k=car[i].r;
                ans2++;
            }
        }
        cout<<ans1<<" "<<m-ans2<<endl;
    }
    return 0;
}

